package main

import (
	"Jam/config"
	"fmt"
	"io/fs"
	"log"
	"os"
	"os/exec"
	"path/filepath"
	"strings"
	"syscall"
)

const (
	jdkURL       = "http://192.168.0.71:9081/hea/jdk/OpenJDK24.msi"
	jdkInstaller = "OpenJDK24.msi"
)

func CheckAndInstallJDK() error {
	cfg, _ := config.Load()
	// 如果配置已存在路径
	if cfg.JDK.InstalledPath != "" {
		if _, err := os.Stat(cfg.JDK.InstalledPath); err == nil {
			return nil
		}
	}
	// 检查JDK是否存在
	if path, exists := checkJDKExists(); exists {
		log.Printf("已找到JDK24: %s", path)
		// 安装成功后更新配置
		cfg.JDK.InstalledPath = path
		config.Save(cfg)
		return nil
	}

	log.Println("未找到JDK24，开始安装...")

	// 下载JDK安装包
	if err := DownloadWithProgress(jdkURL, jdkInstaller); err != nil {
		return fmt.Errorf("下载JDK失败: %v", err)
	}
	defer os.Remove(jdkInstaller)

	// 以管理员权限运行安装程序
	if err := installPackage(jdkInstaller); err != nil {
		log.Printf("Error: %v\n", err)
		os.Exit(1)
	}

	log.Println("JDK安装完成")
	// 安装成功后更新配置
	cfg.JDK.InstalledPath = "C:\\Program Files\\Java\\jdk-24"
	config.Save(cfg)
	return nil
}

// 返回 (找到的路径, 是否存在, 错误)
func checkJDKExists() (string, bool) {

	// 优先检查用户目录
	if userPath := checkUserJDK(); userPath != "" {
		return userPath, true
	}

	// 检查系统目录
	if sysPath, err := checkSystemJDK("24"); err != nil {
		if os.IsPermission(err) {
			log.Printf("权限错误: 无法访问系统JDK目录 (%s)，可能需要管理员权限", sysPath)
		} else if !os.IsNotExist(err) {
			log.Printf("系统目录检测错误: %v", err)
		}
	} else if sysPath != "" {
		return sysPath, true
	}

	return "", false
}

// 检查jdk 24是否安装
// 检查是否安装了指定大版本的 JDK，返回第一个找到的 JDK 路径（找不到返回空字符串）
func checkSystemJDK(majorVersion string) (string, error) {
	commonPaths := []string{
		`C:\Program Files\Java`,
		`C:\Program Files\Eclipse Adoptium`,
	}

	for _, base := range commonPaths {
		entries, err := os.ReadDir(base)
		if err != nil {
			continue // 目录不存在或无权限则跳过
		}

		for _, entry := range entries {
			if entry.IsDir() && strings.HasPrefix(strings.ToLower(entry.Name()), "jdk-"+majorVersion) {
				return filepath.Join(base, entry.Name()), nil
			}
		}
	}

	return "", fmt.Errorf("访问系统JDK目录失败")
}

func checkUserJDK() string {
	userHome, err := os.UserHomeDir()
	if err != nil {
		log.Printf("获取用户目录失败: %v", err)
		return ""
	}

	jdksDir := filepath.Join(userHome, ".jdks")
	_, err = os.Stat(jdksDir)
	if err != nil {
		if !os.IsNotExist(err) {
			log.Printf("访问.jdks目录失败: %v", err)
		}
		return ""
	}

	var foundPath string
	filepath.WalkDir(jdksDir, func(path string, d fs.DirEntry, err error) error {
		if err != nil {
			return err
		}

		if d.IsDir() && strings.HasPrefix(d.Name(), "openjdk-24") {
			foundPath = path
			return fs.SkipAll // 找到后立即停止遍历
		}
		return nil
	})

	return foundPath
}
func installPackage(installerPath string) error {
	// 检查文件是否存在
	if _, err := os.Stat(installerPath); os.IsNotExist(err) {
		return fmt.Errorf("installer file not found: %s", installerPath)
	}

	ext := strings.ToLower(filepath.Ext(installerPath))
	var cmd *exec.Cmd

	switch ext {
	case ".exe":
		// EXE 静默安装
		cmd = exec.Command(installerPath, "/S")
	case ".msi":
		// MSI 静默安装
		cmd = exec.Command("msiexec", "/i", installerPath, "/qn")
	default:
		return fmt.Errorf("unsupported installer format: %s", ext)
	}

	// 隐藏安装窗口（可选）
	cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}

	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr

	if err := cmd.Run(); err != nil {
		return fmt.Errorf("installation failed: %v", err)
	}
	return nil
}
